﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Configuration;
using Fast.Presentation.Print;
using Contract.Business.Process;
using Contract.Business.Entity;
using Contract.Business.Filter;

namespace Fast.Presentation.Bematech
{
    public class MecafW32Printer : IPrinter
    {
        #region Funções Bematech 4200 USB
        /// <summary>
        /// Função que obtém o byte de status da impressora
        /// </summary>
        /// <returns>
        /// 
        /// </returns>
        [DllImport("MecafW32.dll")] 
        public static extern int CPByteStatus();

        /// <summary>
        /// Obtém o estado da impressora
        /// </summary>
        /// <param name="texto"></param>
        /// <returns>
        /// 0 - Indefinido
        /// 1 - OnLine
        /// 2 - Ocupada
        /// 3 - Sem Papel
        /// 4 - Erro
        /// 5 - Documento inserido
        /// 6 - Tampa Aberta
        /// </returns>
        [DllImport("MecafW32.dll")]
        public static extern int CPStatusImp();

        /// <summary>
        /// Efetua a inicialização da impressora via comando
        /// </summary>
        /// <returns>
        /// 0 - Sucesso
        /// Diferente de 0 - Erro
        /// </returns>
        [DllImport("MecafW32.dll")]
        public static extern int CPReset();

        [DllImport("MecafW32.dll")]
        public static extern int CPInit(int modo);

        /// <summary>
        /// Imprime o texto passado no tamanho passado
        /// </summary>
        /// <param name="modo"></param>
        /// <returns></returns>
        [DllImport("MecafW32.dll")]
        public static extern int CPImprime(string texto, int tamanho);

        /// <summary>
        /// Imprime o texto passado no tamanho passado
        /// </summary>
        /// <param name="modo"></param>
        /// <returns></returns>
        [DllImport("MecafW32.dll")]
        public static extern int MECAFW32_CPImprime(string texto, int tamanho);

        [DllImport("MecafW32.dll")]
        public static extern int CPModoDoc();

        [DllImport("MecafW32.dll")]
        public static extern int CPModoPE();

        [DllImport("MecafW32.dll")]
        public static extern int CPValidaDoc(string texto, int tamanho);

        [DllImport("MecafW32.dll")]
        public static extern int MECAFW32_CPValidaDoc(string texto, int tamanho);

        [DllImport("MecafW32.dll")]
        public static extern int CPValidaDupla(string texto, int tamanho);

        [DllImport("MecafW32.dll")]
        public static extern int MECAFW32_CPValidaDupla(string texto, int tamanho);

        [DllImport("MecafW32.dll")]
        public static extern int MECAFW32_CPCancelCmd(string texto, int tamanho);

        [DllImport("MecafW32.dll")]
        public static extern int MECAFW32_AbreCanalDeComunicacao(string porta, string velocidade,string numBits, string paridade, string timeout, string timeoutval);

        [DllImport("MecafW32.dll")]
        public static extern int MECAFW32_FechaCanalDeComunicacao();
        #endregion

        public void imprimir(string text)
        {
            int retorno;

            try
            {
                BPConfiguracao processConfig = new BPConfiguracao();
                BEConfiguracao config = processConfig.ObterTodos(new FEConfiguracao()).First();

                string porta = config.Porta;

                retorno = CPImprime(text, text.Length);
                validaRetorno(retorno, "Configurar Modelo Impressora");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void validaRetorno(int retorno, string nomeFuncao)
        {
            string msgErro = String.Empty;
            switch (retorno)
            {
                //case 0: - Função executada com sucesso
                case 1:
                    msgErro = "Função já em execução : " + nomeFuncao;
                    break;
                case 2:
                    msgErro = "Não é possível executar a função " + nomeFuncao + " pois outra função está em execução.";
                    break;
                case 3:
                    msgErro = "Função " + nomeFuncao + " cancelada.";
                    break;
                case 4:
                    msgErro = "O periférico não está pronto para uso.";
                    break;
                case 5:
                    msgErro = "O periférico não foi inicializado.";
                    break;
                case 6:
                    msgErro = "Não há comando em execução.";
                    break;
                case 7:
                    msgErro = "Função não inicializada.";
                    break;
                case 8:
                    msgErro = "Periférico não encontrado.";
                    break;
                case 9:
                    msgErro = "Ocorreu um Time Out de validação de documento.";
                    break;
                case 10:
                    msgErro = "Impressora sem papel.";
                    break;
                case 50:
                    msgErro = "Erro na execução da função " + nomeFuncao;
                    break;
                case 51:
                    msgErro = "Erro na alocação de recursos do windows";
                    break;
                case 52:
                    msgErro = "Parâmetro inválido.";
                    break;
                case 53:
                    msgErro = "Erro no arquivo de configuração MECAF.INI";
                    break;
                case 54:
                    msgErro = "Time Out de execução da função " + nomeFuncao;
                    break;
                case 55:
                    msgErro = "Erro de comunicação com o periférico.";
                    break;
                default:
                    break;
            }

            if (!String.IsNullOrEmpty(msgErro))
                throw new Exception(msgErro);
        }
    }
}
